#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
视频列表区域模块
负责创建和管理视频列表的UI组件
"""

import os
import cv2
from datetime import datetime
from PySide6.QtWidgets import QListWidget, QListWidgetItem, QGroupBox, QVBoxLayout
from PySide6.QtCore import Qt
from src.config import Config


class VideoListArea:
    """视频列表区域类"""
    
    def __init__(self, main_window=None):
        """初始化视频列表区域"""
        self.video_list_widget = None
        self.main_window = main_window
        
    def create_video_list_area(self, parent_layout):
        """
        创建视频列表区域
        
        创建一个用于显示已导入视频文件列表的区域。
        
        Args:
            parent_layout (QVBoxLayout): 父布局管理器，用于添加视频列表区域组件
            
        Returns:
            tuple: 包含视频列表组件的元组
        """
        video_list_group = QGroupBox("已导入视频")
        video_list_layout = QVBoxLayout(video_list_group)
        
        # 创建视频列表
        self.video_list_widget = QListWidget()
        self.video_list_widget.setMinimumWidth(200)  # 设置最小宽度
        self.video_list_widget.setMaximumWidth(300)  # 设置最大宽度
        
        # 启用拖拽排序功能
        self.video_list_widget.setDragDropMode(QListWidget.InternalMove)
        self.video_list_widget.setDefaultDropAction(Qt.MoveAction)
        
        video_list_layout.addWidget(self.video_list_widget)
        
        parent_layout.addWidget(video_list_group)
        
        return (video_list_group, self.video_list_widget)
    
    def update_video_list(self, video_files, current_index=0):
        """
        更新视频列表显示
        
        Args:
            video_files (list): 视频文件路径列表
            current_index (int): 当前播放的视频索引
        """
        self.video_list_widget.clear()
        
        for i, file_path in enumerate(video_files):
            file_name = file_path.split('/')[-1]
            
            # 获取视频详细信息
            video_info = self.get_video_info(file_path)
            
            # 构建显示文本
            display_text = f"{i+1}. {file_name}\n"
            display_text += f"   大小: {video_info['size']}\n"
            display_text += f"   分辨率: {video_info['resolution']}\n"
            display_text += f"   时长: {video_info['duration']}\n"
            display_text += f"   帧率: {video_info['fps']}\n"
            display_text += f"   创建时间: {video_info['created_time']}"
            
            item = QListWidgetItem(display_text)
            item.setData(Qt.UserRole, file_path)  # 存储完整路径
            
            # 设置当前播放的视频项为选中状态
            if i == current_index:
                item.setBackground(Qt.lightGray)
                font = item.font()
                font.setBold(True)
                item.setFont(font)
            
            self.video_list_widget.addItem(item)
        
        # 连接点击事件
        # 先断开所有现有连接，然后重新连接
        try:
            self.video_list_widget.itemClicked.disconnect()
        except RuntimeError:
            # 如果没有连接则忽略错误
            pass
        self.video_list_widget.itemClicked.connect(self.on_video_item_clicked)
        
        # 连接拖拽排序事件
        try:
            self.video_list_widget.model().rowsMoved.disconnect()
        except RuntimeError:
            pass
        self.video_list_widget.model().rowsMoved.connect(self.on_video_list_reordered)
    
    def on_video_item_clicked(self, item):
        """
        处理视频列表项点击事件
        
        Args:
            item (QListWidgetItem): 被点击的列表项
        """
        # 获取视频在列表中的索引
        index = self.video_list_widget.row(item)
        
        # 使用存储的主窗口引用
        if self.main_window:
            # 切换到选中的视频
            self.main_window.video_functions.switch_to_video_at_index(self.main_window, index)
    
    def on_video_list_reordered(self, parent, start, end, destination, row):
        """
        处理视频列表拖拽排序事件
        
        当用户拖拽视频列表项重新排序时，更新主窗口中的视频文件列表。
        
        Args:
            parent: 父索引
            start: 开始行
            end: 结束行
            destination: 目标父索引
            row: 目标行
        """
        if self.main_window:
            # 重新构建视频文件列表，按照当前列表顺序
            new_video_files = []
            for i in range(self.video_list_widget.count()):
                item = self.video_list_widget.item(i)
                file_path = item.data(Qt.UserRole)
                new_video_files.append(file_path)
            
            # 更新主窗口的视频文件列表
            self.main_window.selected_video_files = new_video_files
            
            print(f"视频列表已重新排序，新顺序: {[os.path.basename(f) for f in new_video_files]}")
    
    def get_video_info(self, file_path):
        """
        获取视频文件的详细信息
        
        Args:
            file_path (str): 视频文件路径
            
        Returns:
            dict: 包含视频信息的字典
        """
        try:
            # 获取文件大小
            file_size = os.path.getsize(file_path)
            size_mb = file_size / (1024 * 1024)
            size_str = f"{size_mb:.1f} MB"
            
            # 获取文件创建时间
            created_time = datetime.fromtimestamp(os.path.getctime(file_path))
            created_time_str = created_time.strftime("%Y-%m-%d %H:%M")
            
            # 使用OpenCV获取视频信息
            cap = cv2.VideoCapture(file_path)
            
            if cap.isOpened():
                # 获取视频分辨率
                width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
                height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
                resolution = f"{width}x{height}"
                
                # 获取帧率
                fps = cap.get(cv2.CAP_PROP_FPS)
                fps_str = f"{fps:.1f} fps"
                
                # 获取总帧数和时长
                frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
                duration_seconds = frame_count / fps if fps > 0 else 0
                
                # 格式化时长
                minutes = int(duration_seconds // 60)
                seconds = int(duration_seconds % 60)
                duration_str = f"{minutes:02d}:{seconds:02d}"
                
                cap.release()
            else:
                resolution = "未知"
                fps_str = "未知"
                duration_str = "未知"
            
            return {
                'size': size_str,
                'resolution': resolution,
                'duration': duration_str,
                'fps': fps_str,
                'created_time': created_time_str
            }
            
        except Exception as e:
            # 如果获取信息失败，返回默认值
            return {
                'size': '未知',
                'resolution': '未知',
                'duration': '未知',
                'fps': '未知',
                'created_time': '未知'
            }